

semaphore mutex_y_13 = 1;   // 控制 thread1 和 thread3 互斥访问 y
semaphore mutex_y_23 = 1;   // 控制 thread2 和 thread3 互斥访问 y
semaphore mutex_z_23 = 1;   // 控制 thread2 和 thread3 互斥访问 z

// 复数的结构类型定义
typedef struct {
    float a;
    float b;
} cnum;

cnum x, y, z; // 全局变量

// 计算两个复数之和
cnum add(cnum p, cnum q) {
    cnum s;
    s.a = p.a + q.a;
    s.b = p.b + q.b;
    return s;
}

thread1() {
    cnum w;
    P(mutex_y_13); // thread1 和 thread3 互斥访问 y
    w = add(x, y);
    V(mutex_y_13);
    ...
}

thread2() {
    cnum w;
    P(mutex_y_23); // thread2 和 thread3 互斥访问 y
    P(mutex_z_23); // thread2 和 thread3 互斥访问 z
    w = add(y, z);
    V(mutex_z_23);
    V(mutex_y_23);
    ...
}

thread3() {
    cnum w;
    w.a = 1;
    w.b = 1;
    P(mutex_z_23); // thread2 和 thread3 互斥访问 z
    z = add(z, w);
    V(mutex_z_23);
    P(mutex_y_13); // thread1 和 thread3 互斥访问 y
    P(mutex_y_23); // thread2 和 thread3 互斥访问 y
    y = add(y, w);
    V(mutex_y_23);
    V(mutex_y_13);
    ...
}

